package com.lihan.utils;

import java.awt.image.BufferedImage;
import java.io.File;
import java.nio.file.Path;
import java.util.HashMap;

import javax.imageio.ImageIO;

import org.springframework.stereotype.Component;

import com.google.zxing.BarcodeFormat;
import com.google.zxing.BinaryBitmap;
import com.google.zxing.EncodeHintType;
import com.google.zxing.MultiFormatReader;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.Result;
import com.google.zxing.client.j2se.BufferedImageLuminanceSource;
import com.google.zxing.client.j2se.MatrixToImageWriter;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.common.HybridBinarizer;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;


/*
* 二维码生成和解析工具类
* */
@Component
@SuppressWarnings("all")
public class QRCodeUtils {
	public void createQRCode(String filePath, String content) {
		int width=300;      		//图片的宽度单位是px
        int height=300;     		//图片的高度
        String format="png";    	//图片的格式

        /**
         * 定义二维码的参数
         */
        HashMap hints=new HashMap();
        hints.put(EncodeHintType.CHARACTER_SET,"utf-8");    //指定字符编码为“utf-8”
        hints.put(EncodeHintType.ERROR_CORRECTION,ErrorCorrectionLevel.M);  //指定二维码的纠错等级为中级
        hints.put(EncodeHintType.MARGIN, 2);    //设置图片的边距

        /**
         * 生成QR二维码
         */
        try {
            //生成二维码矩阵
            /*
            * content ： 编码到二维码中的内容（字符串）。它可以是任何文本信息，比如网址、个人信息
            * BarcodeFormat.QR_CODE 指定要生成的是二维码，还支持生成其他的条形码啥的
            * width, height 单位是px像素
            * hints 是一个用于传递编码或解码提示的参数 map类型
            * */
            BitMatrix bitMatrix=new MultiFormatWriter().encode(content, BarcodeFormat.QR_CODE, width, height,hints);

            Path file=new File(filePath).toPath(); //将 File 对象转换为 Path 对象

            //将bitMatrix 写入文件
            //如果目标文件的路径中所有目录都已存在，但文件本身不存在，ZXing 会自动创建文件，需要保证所有目录都存在
            MatrixToImageWriter.writeToPath(bitMatrix, format, file);
        } catch (Exception e) {
            e.printStackTrace();
        }
	}
	
	public String getContentFromQRCode(String filePath) {
        // MultiFormatReader 是 ZXing 库中用于读取多种格式条码（包括二维码）的类。它支持多种条码格式
		MultiFormatReader formatReader=new MultiFormatReader();

        // ImageIO.read(file) 会从文件路径加载图像，并返回一个 BufferedImage 对象
        File file=new File(filePath);
        BufferedImage image;

        try {
            image = ImageIO.read(file);
            // BinaryBitmap 是 ZXing 中用于表示二值化图像的类。它需要一个 Binarizer 和一个 LuminanceSource
            BinaryBitmap binaryBitmap=new BinaryBitmap(new HybridBinarizer(new BufferedImageLuminanceSource(image)));

            HashMap hints=new HashMap();
            hints.put(EncodeHintType.CHARACTER_SET,"utf-8");    //指定字符编码为“utf-8”
            // formatReader.decode() 方法尝试从二值化图像中解析二维码
            Result result=formatReader.decode(binaryBitmap,hints);
            return result.toString();
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
	}
}
